Instructions

  1. Use the “Visual” markdown version of this document. Click “Visual” in the top-left corner of this document before starting.
  2. All necessary packages are loaded in the first code block. Check if they all load by clicking the Run arrow
  3. Fill in your answers (R code and text) in each block provided.
    • Only questions that include an empty code block need R code

    • All questions need a text answer. Please delete the text “ENTER YOUR RESPONSE HERE” and replace with your answer.

  4. When you are done, re-run all your R code chunks by clicking the down-arrow next to “Run” in the document’s menu bar and selecting “Run All”. Then click “Preview” and go through each answer to make sure the R code and any associated output is provided.
  5. Upload both the Midterm_2024.nb.html and the Midterm_2024.Rmd file to Canvas. Do not rename these files. This way we can grade the anonymously.
  6. This exam is to be done independently. Please do not consult with others in the class. You can use any external resource available to you. But we will grade based on the material I presented in class.
  7. If you have clarification questions:
    1. Check Piazza to see if the question has been addressed already

    2. If not, email the professor or TAs. We will post answers to Piazza so that everyone has access to the clarifications. Please do not post directly so as not to give away answers to others.

  8. Read every question completely and carefully! Below the bold title-text the notes and instructions are very important to answering correctly.

Part 1

Plant genomes are often more tolerant of large-scale chromosomal changes, such as genome duplications, than animal genomes. An experiment was run to test the hypothesis that triploid genotypes (3 copies of each chromosome per cell) of the Midwestern prairie grass species Big Bluestem (Andropogon gerardii) grew faster (produced more biomass) than diploid genotypes (2 copies of each chromosome per cell). In genetics, “Diploid” and “Triploid” are levels of ploidy. The experimenter collected 10 genotypes (each an individual plant at a unique collection site) of each ploidy from across the species range. From each genotype, three clonal replicates were created by cutting stems, inducing root growth, and planting in a randomized position in a field trial. The cuttings were all approximately the same size and age at the time of planting. The three clonal replicates were grown in consecutive plots in the field. See the figure below for the experimental layout. In the figure, the diploid genotypes are named D0-D9 and the triploids are labeled T0-T9. Clonal replicates are numbered 1-3 (e.g. \(D3_2\) means the 2nd clone of the “D3” diploid genotype. At the end of the growing season, all above-ground tissue from each individual plants was harvested, dried, and individually weighed. The experimental field was adjacent to a road and a wheat field as shown, but otherwise surrounded by un-managed fields.

1.1 Critique the experimental design

1.1.1 Is the field layout optimal? [10 points]

Is it better to have the clonal replicates adjacent in the field or randomly distributed? Are there any other issues with how the experiment was laid out that should have been considered?

In my opinion, a fully random distribution would be more appropriate. If there are aspects of the field that affect biomass production, placing clonal replicates adjacent to each other would intuitively make it more likely for all of them to be confounded at once. A fully randomized placement would lower the chance that a rogue patch of field that is better at growing plants makes a certain genotype over-perform.

I’m also not a huge fan of this experiment’s scope being limited to solely ploidy when using 10 separate, independent genomes for each. It is not a reasonable assumption to estimate the effect on biomass production solely on ploidy; it is undeniable that an individual’s genotype, epigenetic and environmental factors also contribute to its phenotypic response, and those are not factors that would have been accounted for in the current experimental design. The environment the genotypes were found in could be just as culpable as their genetic makeup, and a gene expressed in some or one of the genotypes that increases biomass could cause us to overestimate or underestimate the effect ploidy has on biomass production. Furthermore, quantitative traits like biomass tend to be complex traits: not controlled by any one single locus or gene. Testing dosage dependence (i.e. the effect of ploidy) on biomass production would also require identifying candidate loci that are uniformly present in every genome (meaning they would all have to be similarly hetero or homozygotic, which is another place where dosage dependence can affect phenotype). If, for example, the majority of loci involved in biomass production were homozygous in diploid genomes and had two copies out of the three in the triploid genomes, there is a real chance that there would be no discernible difference between them.

1.1.2 What criteria determine whether it is worth including clonal replicates of each genotype? [10 points]

Here is some guidance: i) The act of clonal generation is relatively easy and quick, ii) Finding more genotypes is challenging. It requires lots of driving and expensive assays to measure ploidy. It is not feasible to get more genotypes. iii) Field costs are high (adding more plots is expensive), but doing more field seasons is much more costly than one large field season. You do not need to give a quantitative answer, but discuss the factors that are important to consider

There’s a balance to strike between minimizing cost and maximizing sample size and managing the variance of the population. Of course, having more genomes for the respective ploidies potentially reduces your standard error for your estimation by increasing the sample size. However, it will likely also increase your population’s variance; it’s not only necessary to measure ploidy but also at least do some kind of genotype assay to ensure there’s no genomes that could contribute to biomass production independently of ploidy. The more plants you have, the more work you have to reduce the chance that anything other than the ploidy is contributing to biomass production, in addition to the already intensive process of determining ploidy to begin with (likely requiring some kind of vizualization with something like DAPI and C-banding to isolate cells mid-division and determine chromosome counts). Were one of the genomes to have a gene that encourages more biomass production, it may cause us to come to the wrong conclusion about the effect of ploidy on biomass production by overestimating its effect in that strain. The scope of the experiment is solely focused on ploidy, so including this would only serve to muddle our conclusion.

On the logistics side, as mentioned above, there’s only so much driving and hunting for individual genomes that can be done before real world constraints like “grant deadlines” and “seasons” become an issue. But because bigger plots are cheaper than repeating plots across time, there’s an incentive to maximize the amount you can do at one time (also, there’s a chance at temporal pseudoreplication if multiple field seasons are used, but that would be contingent on design). Clonal replicates via plant tissue culture are reasonably easy to create, and can be done in a lab before being planted in a field in order to standardize the process as much as possible.

1.1.3 Is this a mensurative or manipulative experiment? Does the design match the scope of the research question? [10 points]

Note: Mensurative experiments include both “simple mensurative” and “comparitive mensurative” experiments

This is a comparitive mensurative experiment: one that seeks to compare measurements of otherwise unmodified experimental units, and lacks any manipulation of any kind of condition for a manipulative experiment.

The design falls short of the scope, in my opinion. 10 unique genomes for each ploidy introduces too many points of confusion for me to consider it appropriate. Any number of things could contribute to biomass production, and there’s no way in the experiment design to ensure that the effect is solely due to ploidy. This is a case where a manipulative experiment would be more appropriate, in my opinion. That would be the only way to isolate ploidy as the source of any effect, by ensuring that the different experimental units are otherwise identical. Otherwise, extensive, expensive genetic screens would be necessary to ensure that the different genomes are similar enough to compare.

A manipulative experiment would require more steps but may not be that unattainable; I would start with a candidate gene study running a GWAS for height in a group of similar individuals (i.e. just diploid or triploid), then from there see if instead of full polyploidy, if our target organism would instead be tolerant to aneuploidy. Creation of aneuploidic strains is much simpler and cheaper than inducing polyploidy or reducing ploidy. An in vitro or tissue-culture proof of concept would not only lend more strength to any conclusion you make, but also make you a stronger candidate for funding.


1.2 Analyse data collected from the experiment

Data from the experiment are here:

'data.frame':   60 obs. of  4 variables:
 $ Genotype: chr  "D1" "D1" "D1" "T0" ...
 $ Clone   : int  1 2 3 1 2 3 1 2 3 1 ...
 $ Ploidy  : chr  "Diploid" "Diploid" "Diploid" "Triploid" ...
 $ Biomass : num  99.6 96.8 82.7 95.7 147.9 ...

1.2.1 Fill in the Design Table for this experiment [10 points]

Provide an explanation for your choice of Experimental Unit and Replication for the treatment

Structure Variable Type # levels Experimental Unit Replication
Treatment Ploidy Categorical 2 Genotype None
Design Genotype Categorical 20
Clone Categorical 3
Genotype:Clone Categorical 60
Response Biomass Numeric 60

I chose genotype as the experimental unit, it was the best choice given that each corresponded to a single treatment level (i.e. diploid or triploid). I considered the clones, but ultimately decided that they were more appropriately described as subsamples, given that they were copies of a single genotype and therefore

1.2.2 Do any columns of bluestem_data need to be changed or added to be consistent with the design table? [5 points]

Make any necessary changes here:

Sure do! Every column of the data save Biomass are categorical and need to be either chr or factor, and since Clone is not, I will convert it to factor.

1.2.3 Write the linear model for this experiment using the R function lm() or lmer() as appropriate: [5 points]

Explain why you chose lm() or lmer()

I’m going to use lmer here, since there is some randomness that each subsample clone can contribute to effect (i.e., given three clones with no other differences, there could still be different estimations of effects due to randomness).

1.2.4 Make the model diagnostic plots shown in lab. Is there reason to be concerned about any of the model assumptions? [5 points]

Our normality assumption looks good, and the variances are relatively similar to each other, though there are a few that are higher than the others. This might be a place to be concerned, but otherwise we’re in the clear.

1.2.5 Use the emmeans() and contrast() functions to perform a Hypothesis test against the null hypothesis that the Ploidy had no effect on biomass. [10 points]

Report the result of this test as if you were writing a paper in a journal that requests you use \(\alpha = 0.05\).

Warning in class(object) <- "environment" :
  Setting class(x) to "environment" sets attribute to NULL; result will no longer be an S4 object
Warning in class(object) <- "environment" :
  Setting class(x) to "environment" sets attribute to NULL; result will no longer be an S4 object
 contrast           estimate   SE df t.ratio p.value
 Diploid - Triploid    -48.7 12.1 18  -4.010  0.0008

Results are averaged over the levels of: Clone 
Degrees-of-freedom method: kenward-roger 

Our estimate of ploidy appears to be significant at a = 0.05, causing us to reject the null hypothesis that the estimate of its effect is 0.


Part 2

An experiment was run to test whether diurnal or nocturnal pollination is more important for fruit set in lowbush blueberries. A large patch of lowbush blueberries was selected at the end of May and 30 branches with unopened flowers were identified, with only a single branch selected per individual bush. Each branch was randomly allocated to one of 5 treatments:

  1. No pollinators: Left continually bagged (no pollinator access)
  2. Diurnal pollinators: bagged to exclude pollinators during nighttime hours
  3. Nocturnal pollination: bagged to exclude pollinators during during daytime hours
  4. No bag treatment: continuous pollinator access
  5. Sham treatment: bags placed and immediately removed once daily to stimulate experimental flower manipulation during treatments 2 and 3

Each branch was monitored until fruits had been set, and then they measured the percentage of flower buds that set fruit per branch.

The researchers presented the following summarized data:

No pollinators Diurnal pollinators Nocturnal pollinators No bags Sham
Num reps: \(n_i\) 6 6 6 6 6
Sample mean (%): \(\hat\mu_i\) 20 52 33 58 48
Sample SD: \(\sqrt{s^2_i}\) 4.1 5.3 3.7 7 6.3

2.1 Is this a Direct or Indirect experiment? [5 points]

Explain your answer

Indirect. This involves the measurement of a few different means, but each EU is only subjected to a single treatment level. It’s possible to directly estimate the means of each EU, and with those we will indirectly estimate the difference, delta-hat. (I.E. mu-A - mu-B and so on)

2.2 Estimate the maximum effect of the pollinator exclusion bags on fruit set. Provide a 95% confidence interval around this estimate. [10 points]

Choose which comparisons are relevant to this question and use those to choose an appropriate critical value from the table below. You might not need to compare all the five treatments to answer the question.

Distribution DF = 10 DF = 15 DF = 20 DF = 25
T 2.23 2.13 2.09 2.06
Dunnet(3) 2.76 2.63 2.56 2.52
Tukey(4) 3.06 2.88 2.8 2.75
Tukey(5) 3.29 3.09 2.99 2.94
[1] 25
[1] 37.84267
[1] 12.15733

I’m opting to use the Tukey distribution. The goal is to find the maximum effect of bagging. That is in essence a “pairwise” comparison, since without comparing two bagging schema it is impossible to determine what the ‘maximum’ is. Two schema could indeed be different than the control as per the Dunnett distribution, but in the Dunnett distribution we cannot directly compare the treatments. With that in mind, I’m going to compare all of the treatment levels to the “No Bag” level, which is the negative control. The values other than Diurnal and Nocturnal are controls/sanity checks, and important to verify that the design functions to answer this question. However, the negative and positive controls will not be candidates for “maximum effect”.

My degrees of freedom will eqpual 25 in this case, 5*(6-1), since I will be comparing all treatments to each other, which makes my t-crit 2.94.

My estimated effect is -25%, with a confidence interval of -12.2% to -37.8%

2.3 Since the researcher’s stated goal was to compare fruit set between the diurnal and nocturnal treatments, would they have been better off allocating 9 branches to those two treatments and only 4 to the others? [10 points]

What comparisons would have had smaller TRUE standard errors? Which comparisons would have had larger TRUE standard errors? How much smaller/larger?

[1] 0.09175171
[1] -0.07491496

Assuming that the variances of population and measurement didn’t change (which they shouldn’t for true values, the standard errors of all treatments with n = 4 would be larger, and all treatments with n = 9 would be smaller. The square root of 6 is 2.45, so the n = 4 standard errors would increase by 9.1%, and the n = 9 standard errors would decrease by 7.5%

2.4 Speculate on WHY the researchers included treatments #’s 1, 4, and 5 in this experiment. [10 points]

  • Explain what they would conclude if they observed fruit set wasn’t much lower in #1 than #4. Would this change the interpretation of the effect diurnal vs nocturnal pollinator exclusion?

  • Explain what they would conclude if they observed that fruit set was much lower in #5 than #4. Would this change the interpretation of the effect diurnal vs nocturnal pollinator exclusion?

Treatments 1, 4, and 5 are present as controls. They are there to ensure that any changes that can be observed are the result of their experiment and not outside factors. If the fruit set wasn’t much lower in #1 than #4, it would cast into question the efficacy of the bags in preventing pollination. Any difference in diurnal vs nocturnal exclusion would be difficult to attribute to isolation via a bag that is otherwise faulty.

If the fruit set in 5 was much lower than 4, then the mere act of placing a bag on a branch could be reducing the fruit set. This, too, would effect the interpretation of diurnal vs nocturnal pollinator exclusion, because it would cast into doubt that the reduction was due to exclusion and not the physical manipulation on the branch by the bag itself.

LS0tCnRpdGxlOiAiTWlkdGVybSAyMDI0IgpvdXRwdXQ6IAogaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBudW1iZXJfc2VjdGlvbnM6IGZhbHNlCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCiAgbWFya2Rvd246IAogICAgd3JhcDogNzIKLS0tCgojIEluc3RydWN0aW9ucwoKMS4gIFVzZSB0aGUgIlZpc3VhbCIgbWFya2Rvd24gdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50LiBDbGljayAiVmlzdWFsIgogICAgaW4gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGlzIGRvY3VtZW50IGJlZm9yZSBzdGFydGluZy4KMi4gIEFsbCBuZWNlc3NhcnkgcGFja2FnZXMgYXJlIGxvYWRlZCBpbiB0aGUgZmlyc3QgY29kZSBibG9jay4gQ2hlY2sgaWYKICAgIHRoZXkgYWxsIGxvYWQgYnkgY2xpY2tpbmcgdGhlIFJ1biBhcnJvdwozLiAgRmlsbCBpbiB5b3VyIGFuc3dlcnMgKFIgY29kZSBhbmQgdGV4dCkgaW4gZWFjaCBibG9jayBwcm92aWRlZC4KICAgIC0gICBPbmx5IHF1ZXN0aW9ucyB0aGF0IGluY2x1ZGUgYW4gZW1wdHkgY29kZSBibG9jayBuZWVkIFIgY29kZQoKICAgIC0gICBBbGwgcXVlc3Rpb25zIG5lZWQgYSB0ZXh0IGFuc3dlci4gUGxlYXNlIGRlbGV0ZSB0aGUgdGV4dCAiRU5URVIKICAgICAgICBZT1VSIFJFU1BPTlNFIEhFUkUiIGFuZCByZXBsYWNlIHdpdGggeW91ciBhbnN3ZXIuCjQuICBXaGVuIHlvdSBhcmUgZG9uZSwgcmUtcnVuIGFsbCB5b3VyIFIgY29kZSBjaHVua3MgYnkgY2xpY2tpbmcgdGhlCiAgICBkb3duLWFycm93IG5leHQgdG8gIlJ1biIgaW4gdGhlIGRvY3VtZW50J3MgbWVudSBiYXIgYW5kIHNlbGVjdGluZwogICAgIlJ1biBBbGwiLiBUaGVuIGNsaWNrICJQcmV2aWV3IiBhbmQgZ28gdGhyb3VnaCBlYWNoIGFuc3dlciB0byBtYWtlCiAgICBzdXJlIHRoZSBSIGNvZGUgYW5kIGFueSBhc3NvY2lhdGVkIG91dHB1dCBpcyBwcm92aWRlZC4KNS4gIFVwbG9hZCBib3RoIHRoZSBNaWR0ZXJtXzIwMjQubmIuaHRtbCBhbmQgdGhlIE1pZHRlcm1fMjAyNC5SbWQgZmlsZQogICAgdG8gQ2FudmFzLiBEbyBub3QgcmVuYW1lIHRoZXNlIGZpbGVzLiBUaGlzIHdheSB3ZSBjYW4gZ3JhZGUgdGhlCiAgICBhbm9ueW1vdXNseS4KNi4gIFRoaXMgZXhhbSBpcyB0byBiZSBkb25lIGluZGVwZW5kZW50bHkuIFBsZWFzZSBkbyBub3QgY29uc3VsdCB3aXRoCiAgICBvdGhlcnMgaW4gdGhlIGNsYXNzLiBZb3UgY2FuIHVzZSBhbnkgZXh0ZXJuYWwgcmVzb3VyY2UgYXZhaWxhYmxlIHRvCiAgICB5b3UuIEJ1dCB3ZSB3aWxsIGdyYWRlIGJhc2VkIG9uIHRoZSBtYXRlcmlhbCBJIHByZXNlbnRlZCBpbiBjbGFzcy4KNy4gIElmIHlvdSBoYXZlIGNsYXJpZmljYXRpb24gcXVlc3Rpb25zOgogICAgMS4gIENoZWNrIFBpYXp6YSB0byBzZWUgaWYgdGhlIHF1ZXN0aW9uIGhhcyBiZWVuIGFkZHJlc3NlZCBhbHJlYWR5CgogICAgMi4gIElmIG5vdCwgZW1haWwgdGhlIHByb2Zlc3NvciBvciBUQXMuICoqV2Ugd2lsbCBwb3N0IGFuc3dlcnMgdG8KICAgICAgICBQaWF6emEgc28gdGhhdCBldmVyeW9uZSBoYXMgYWNjZXNzIHRvIHRoZSBjbGFyaWZpY2F0aW9ucy4gUGxlYXNlCiAgICAgICAgZG8gbm90IHBvc3QgZGlyZWN0bHkgc28gYXMgbm90IHRvIGdpdmUgYXdheSBhbnN3ZXJzIHRvIG90aGVycy4qKgo4LiAgUmVhZCBldmVyeSBxdWVzdGlvbiAqKmNvbXBsZXRlbHkqKiBhbmQgKipjYXJlZnVsbHkqKiEgQmVsb3cgdGhlIGJvbGQKICAgIHRpdGxlLXRleHQgdGhlIG5vdGVzIGFuZCBpbnN0cnVjdGlvbnMgYXJlIHZlcnkgaW1wb3J0YW50IHRvCiAgICBhbnN3ZXJpbmcgY29ycmVjdGx5LgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7ciBlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CldJVEhfQ0hVTktTID0gVFJVRQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZW1tZWFucykKbGlicmFyeShsbWU0KQpsaWJyYXJ5KGxtZXJUZXN0KQpsaWJyYXJ5KG11bHRjb21wKQpsaWJyYXJ5KG11bHRjb21wVmlldykKbGlicmFyeShQTFMyMDUpCmBgYAoKIVtdKGJsdWVzdGVtLkpQRyl7d2lkdGg9IjcwMCJ9CgojIFBhcnQgMQoKUGxhbnQgZ2Vub21lcyBhcmUgb2Z0ZW4gbW9yZSB0b2xlcmFudCBvZiBsYXJnZS1zY2FsZSBjaHJvbW9zb21hbApjaGFuZ2VzLCBzdWNoIGFzIGdlbm9tZSBkdXBsaWNhdGlvbnMsIHRoYW4gYW5pbWFsIGdlbm9tZXMuIEFuIGV4cGVyaW1lbnQKd2FzIHJ1biB0byB0ZXN0IHRoZSBoeXBvdGhlc2lzIHRoYXQgdHJpcGxvaWQgZ2Vub3R5cGVzICgzIGNvcGllcyBvZiBlYWNoCmNocm9tb3NvbWUgcGVyIGNlbGwpIG9mIHRoZSBNaWR3ZXN0ZXJuIHByYWlyaWUgZ3Jhc3Mgc3BlY2llcyBCaWcKQmx1ZXN0ZW0gKCpBbmRyb3BvZ29uIGdlcmFyZGlpKikgZ3JldyBmYXN0ZXIgKHByb2R1Y2VkIG1vcmUgYmlvbWFzcykKdGhhbiBkaXBsb2lkIGdlbm90eXBlcyAoMiBjb3BpZXMgb2YgZWFjaCBjaHJvbW9zb21lIHBlciBjZWxsKS4gSW4KZ2VuZXRpY3MsICJEaXBsb2lkIiBhbmQgIlRyaXBsb2lkIiBhcmUgbGV2ZWxzIG9mIHBsb2lkeS4gVGhlCmV4cGVyaW1lbnRlciBjb2xsZWN0ZWQgMTAgZ2Vub3R5cGVzIChlYWNoIGFuIGluZGl2aWR1YWwgcGxhbnQgYXQgYQp1bmlxdWUgY29sbGVjdGlvbiBzaXRlKSBvZiBlYWNoIHBsb2lkeSBmcm9tIGFjcm9zcyB0aGUgc3BlY2llcyByYW5nZS4KRnJvbSBlYWNoIGdlbm90eXBlLCB0aHJlZSBjbG9uYWwgcmVwbGljYXRlcyB3ZXJlIGNyZWF0ZWQgYnkgY3V0dGluZwpzdGVtcywgaW5kdWNpbmcgcm9vdCBncm93dGgsIGFuZCBwbGFudGluZyBpbiBhIHJhbmRvbWl6ZWQgcG9zaXRpb24gaW4gYQpmaWVsZCB0cmlhbC4gVGhlIGN1dHRpbmdzIHdlcmUgYWxsIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgc2l6ZSBhbmQgYWdlCmF0IHRoZSB0aW1lIG9mIHBsYW50aW5nLiBUaGUgdGhyZWUgY2xvbmFsIHJlcGxpY2F0ZXMgd2VyZSBncm93biBpbgpjb25zZWN1dGl2ZSBwbG90cyBpbiB0aGUgZmllbGQuIFNlZSB0aGUgZmlndXJlIGJlbG93IGZvciB0aGUKZXhwZXJpbWVudGFsIGxheW91dC4gSW4gdGhlIGZpZ3VyZSwgdGhlIGRpcGxvaWQgZ2Vub3R5cGVzIGFyZSBuYW1lZApEMC1EOSBhbmQgdGhlIHRyaXBsb2lkcyBhcmUgbGFiZWxlZCBUMC1UOS4gQ2xvbmFsIHJlcGxpY2F0ZXMgYXJlCm51bWJlcmVkIDEtMyAoZS5nLiAkRDNfMiQgbWVhbnMgdGhlIDJuZCBjbG9uZSBvZiB0aGUgIkQzIiBkaXBsb2lkCmdlbm90eXBlLiBBdCB0aGUgZW5kIG9mIHRoZSBncm93aW5nIHNlYXNvbiwgYWxsIGFib3ZlLWdyb3VuZCB0aXNzdWUgZnJvbQplYWNoIGluZGl2aWR1YWwgcGxhbnRzIHdhcyBoYXJ2ZXN0ZWQsIGRyaWVkLCBhbmQgaW5kaXZpZHVhbGx5IHdlaWdoZWQuClRoZSBleHBlcmltZW50YWwgZmllbGQgd2FzIGFkamFjZW50IHRvIGEgcm9hZCBhbmQgYSB3aGVhdCBmaWVsZCBhcwpzaG93biwgYnV0IG90aGVyd2lzZSBzdXJyb3VuZGVkIGJ5IHVuLW1hbmFnZWQgZmllbGRzLgoKIVtdKEJpZ0JsdWVzdGVtLmpwZyl7d2lkdGg9IjcwMCJ9CgojIyAxLjEgQ3JpdGlxdWUgdGhlIGV4cGVyaW1lbnRhbCBkZXNpZ24KCiMjIyAxLjEuMSBJcyB0aGUgZmllbGQgbGF5b3V0IG9wdGltYWw/IFsxMCBwb2ludHNdCgpJcyBpdCBiZXR0ZXIgdG8gaGF2ZSB0aGUgY2xvbmFsIHJlcGxpY2F0ZXMgYWRqYWNlbnQgaW4gdGhlIGZpZWxkIG9yCnJhbmRvbWx5IGRpc3RyaWJ1dGVkPyBBcmUgdGhlcmUgYW55IG90aGVyIGlzc3VlcyB3aXRoIGhvdyB0aGUgZXhwZXJpbWVudAp3YXMgbGFpZCBvdXQgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIGNvbnNpZGVyZWQ/Cgo+IEluIG15IG9waW5pb24sIGEgZnVsbHkgcmFuZG9tIGRpc3RyaWJ1dGlvbiB3b3VsZCBiZSBtb3JlIGFwcHJvcHJpYXRlLgo+IElmIHRoZXJlIGFyZSBhc3BlY3RzIG9mIHRoZSBmaWVsZCB0aGF0IGFmZmVjdCBiaW9tYXNzIHByb2R1Y3Rpb24sCj4gcGxhY2luZyBjbG9uYWwgcmVwbGljYXRlcyBhZGphY2VudCB0byBlYWNoIG90aGVyIHdvdWxkIGludHVpdGl2ZWx5Cj4gbWFrZSBpdCBtb3JlIGxpa2VseSBmb3IgYWxsIG9mIHRoZW0gdG8gYmUgY29uZm91bmRlZCBhdCBvbmNlLiBBIGZ1bGx5Cj4gcmFuZG9taXplZCBwbGFjZW1lbnQgd291bGQgbG93ZXIgdGhlIGNoYW5jZSB0aGF0IGEgcm9ndWUgcGF0Y2ggb2YKPiBmaWVsZCB0aGF0IGlzIGJldHRlciBhdCBncm93aW5nIHBsYW50cyBtYWtlcyBhIGNlcnRhaW4gZ2Vub3R5cGUKPiBvdmVyLXBlcmZvcm0uCj4KPiBJJ20gYWxzbyBub3QgYSBodWdlIGZhbiBvZiB0aGlzIGV4cGVyaW1lbnQncyBzY29wZSBiZWluZyBsaW1pdGVkIHRvCj4gc29sZWx5IHBsb2lkeSB3aGVuIHVzaW5nIDEwIHNlcGFyYXRlLCBpbmRlcGVuZGVudCBnZW5vbWVzIGZvciBlYWNoLiBJdAo+IGlzIG5vdCBhIHJlYXNvbmFibGUgYXNzdW1wdGlvbiB0byBlc3RpbWF0ZSB0aGUgZWZmZWN0IG9uIGJpb21hc3MKPiBwcm9kdWN0aW9uIHNvbGVseSBvbiBwbG9pZHk7IGl0IGlzIHVuZGVuaWFibGUgdGhhdCBhbiBpbmRpdmlkdWFsJ3MKPiBnZW5vdHlwZSwgZXBpZ2VuZXRpYyBhbmQgZW52aXJvbm1lbnRhbCBmYWN0b3JzIGFsc28gY29udHJpYnV0ZSB0byBpdHMKPiBwaGVub3R5cGljIHJlc3BvbnNlLCBhbmQgdGhvc2UgYXJlIG5vdCBmYWN0b3JzIHRoYXQgd291bGQgaGF2ZSBiZWVuCj4gYWNjb3VudGVkIGZvciBpbiB0aGUgY3VycmVudCBleHBlcmltZW50YWwgZGVzaWduLiBUaGUgZW52aXJvbm1lbnQgdGhlCj4gZ2Vub3R5cGVzIHdlcmUgZm91bmQgaW4gY291bGQgYmUganVzdCBhcyBjdWxwYWJsZSBhcyB0aGVpciBnZW5ldGljCj4gbWFrZXVwLCBhbmQgYSBnZW5lIGV4cHJlc3NlZCBpbiBzb21lIG9yIG9uZSBvZiB0aGUgZ2Vub3R5cGVzIHRoYXQKPiBpbmNyZWFzZXMgYmlvbWFzcyBjb3VsZCBjYXVzZSB1cyB0byBvdmVyZXN0aW1hdGUgb3IgdW5kZXJlc3RpbWF0ZSB0aGUKPiBlZmZlY3QgcGxvaWR5IGhhcyBvbiBiaW9tYXNzIHByb2R1Y3Rpb24uIEZ1cnRoZXJtb3JlLCBxdWFudGl0YXRpdmUKPiB0cmFpdHMgbGlrZSBiaW9tYXNzIHRlbmQgdG8gYmUgY29tcGxleCB0cmFpdHM6IG5vdCBjb250cm9sbGVkIGJ5IGFueQo+IG9uZSBzaW5nbGUgbG9jdXMgb3IgZ2VuZS4gVGVzdGluZyBkb3NhZ2UgZGVwZW5kZW5jZSAoaS5lLiB0aGUgZWZmZWN0Cj4gb2YgcGxvaWR5KSBvbiBiaW9tYXNzIHByb2R1Y3Rpb24gd291bGQgYWxzbyByZXF1aXJlIGlkZW50aWZ5aW5nCj4gY2FuZGlkYXRlIGxvY2kgdGhhdCBhcmUgdW5pZm9ybWx5IHByZXNlbnQgaW4gZXZlcnkgZ2Vub21lIChtZWFuaW5nCj4gdGhleSB3b3VsZCBhbGwgaGF2ZSB0byBiZSBzaW1pbGFybHkgaGV0ZXJvIG9yIGhvbW96eWdvdGljLCB3aGljaCBpcwo+IGFub3RoZXIgcGxhY2Ugd2hlcmUgZG9zYWdlIGRlcGVuZGVuY2UgY2FuIGFmZmVjdCBwaGVub3R5cGUpLiBJZiwgZm9yCj4gZXhhbXBsZSwgdGhlIG1ham9yaXR5IG9mIGxvY2kgaW52b2x2ZWQgaW4gYmlvbWFzcyBwcm9kdWN0aW9uIHdlcmUKPiBob21venlnb3VzIGluIGRpcGxvaWQgZ2Vub21lcyBhbmQgaGFkIHR3byBjb3BpZXMgb3V0IG9mIHRoZSB0aHJlZSBpbgo+IHRoZSB0cmlwbG9pZCBnZW5vbWVzLCB0aGVyZSBpcyBhIHJlYWwgY2hhbmNlIHRoYXQgdGhlcmUgd291bGQgYmUgbm8KPiBkaXNjZXJuaWJsZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlbS4KCiMjIyAxLjEuMiBXaGF0IGNyaXRlcmlhIGRldGVybWluZSB3aGV0aGVyIGl0IGlzIHdvcnRoIGluY2x1ZGluZyBjbG9uYWwgcmVwbGljYXRlcyBvZiBlYWNoIGdlbm90eXBlPyBbMTAgcG9pbnRzXQoKSGVyZSBpcyBzb21lIGd1aWRhbmNlOiBpKSBUaGUgYWN0IG9mIGNsb25hbCBnZW5lcmF0aW9uIGlzIHJlbGF0aXZlbHkKZWFzeSBhbmQgcXVpY2ssIGlpKSBGaW5kaW5nIG1vcmUgZ2Vub3R5cGVzIGlzIGNoYWxsZW5naW5nLiBJdCByZXF1aXJlcwpsb3RzIG9mIGRyaXZpbmcgYW5kIGV4cGVuc2l2ZSBhc3NheXMgdG8gbWVhc3VyZSBwbG9pZHkuIEl0IGlzIG5vdApmZWFzaWJsZSB0byBnZXQgbW9yZSBnZW5vdHlwZXMuIGlpaSkgRmllbGQgY29zdHMgYXJlIGhpZ2ggKGFkZGluZyBtb3JlCnBsb3RzIGlzIGV4cGVuc2l2ZSksIGJ1dCBkb2luZyBtb3JlIGZpZWxkIHNlYXNvbnMgaXMgbXVjaCBtb3JlIGNvc3RseQp0aGFuIG9uZSBsYXJnZSBmaWVsZCBzZWFzb24uIFlvdSBkbyBub3QgbmVlZCB0byBnaXZlIGEgcXVhbnRpdGF0aXZlCmFuc3dlciwgYnV0IGRpc2N1c3MgdGhlIGZhY3RvcnMgdGhhdCBhcmUgaW1wb3J0YW50IHRvIGNvbnNpZGVyCgo+IFRoZXJlJ3MgYSBiYWxhbmNlIHRvIHN0cmlrZSBiZXR3ZWVuIG1pbmltaXppbmcgY29zdCBhbmQgbWF4aW1pemluZwo+IHNhbXBsZSBzaXplIGFuZCBtYW5hZ2luZyB0aGUgdmFyaWFuY2Ugb2YgdGhlIHBvcHVsYXRpb24uIE9mIGNvdXJzZSwKPiBoYXZpbmcgbW9yZSBnZW5vbWVzIGZvciB0aGUgcmVzcGVjdGl2ZSBwbG9pZGllcyBwb3RlbnRpYWxseSByZWR1Y2VzCj4geW91ciBzdGFuZGFyZCBlcnJvciBmb3IgeW91ciBlc3RpbWF0aW9uIGJ5IGluY3JlYXNpbmcgdGhlIHNhbXBsZSBzaXplLgo+IEhvd2V2ZXIsIGl0IHdpbGwgbGlrZWx5IGFsc28gaW5jcmVhc2UgeW91ciBwb3B1bGF0aW9uJ3MgdmFyaWFuY2U7IGl0J3MKPiBub3Qgb25seSBuZWNlc3NhcnkgdG8gbWVhc3VyZSBwbG9pZHkgYnV0IGFsc28gYXQgbGVhc3QgZG8gc29tZSBraW5kIG9mCj4gZ2Vub3R5cGUgYXNzYXkgdG8gZW5zdXJlIHRoZXJlJ3Mgbm8gZ2Vub21lcyB0aGF0IGNvdWxkIGNvbnRyaWJ1dGUgdG8KPiBiaW9tYXNzIHByb2R1Y3Rpb24gaW5kZXBlbmRlbnRseSBvZiBwbG9pZHkuIFRoZSBtb3JlIHBsYW50cyB5b3UgaGF2ZSwKPiB0aGUgbW9yZSB3b3JrIHlvdSBoYXZlIHRvIHJlZHVjZSB0aGUgY2hhbmNlIHRoYXQgYW55dGhpbmcgb3RoZXIgdGhhbgo+IHRoZSBwbG9pZHkgaXMgY29udHJpYnV0aW5nIHRvIGJpb21hc3MgcHJvZHVjdGlvbiwgaW4gYWRkaXRpb24gdG8gdGhlCj4gYWxyZWFkeSBpbnRlbnNpdmUgcHJvY2VzcyBvZiBkZXRlcm1pbmluZyBwbG9pZHkgdG8gYmVnaW4gd2l0aCAobGlrZWx5Cj4gcmVxdWlyaW5nIHNvbWUga2luZCBvZiB2aXp1YWxpemF0aW9uIHdpdGggc29tZXRoaW5nIGxpa2UgREFQSSBhbmQKPiBDLWJhbmRpbmcgdG8gaXNvbGF0ZSBjZWxscyBtaWQtZGl2aXNpb24gYW5kIGRldGVybWluZSBjaHJvbW9zb21lCj4gY291bnRzKS4gV2VyZSBvbmUgb2YgdGhlIGdlbm9tZXMgdG8gaGF2ZSBhIGdlbmUgdGhhdCBlbmNvdXJhZ2VzIG1vcmUKPiBiaW9tYXNzIHByb2R1Y3Rpb24sIGl0IG1heSBjYXVzZSB1cyB0byBjb21lIHRvIHRoZSB3cm9uZyBjb25jbHVzaW9uCj4gYWJvdXQgdGhlIGVmZmVjdCBvZiBwbG9pZHkgb24gYmlvbWFzcyBwcm9kdWN0aW9uIGJ5IG92ZXJlc3RpbWF0aW5nIGl0cwo+IGVmZmVjdCBpbiB0aGF0IHN0cmFpbi4gVGhlIHNjb3BlIG9mIHRoZSBleHBlcmltZW50IGlzIHNvbGVseSBmb2N1c2VkCj4gb24gcGxvaWR5LCBzbyBpbmNsdWRpbmcgdGhpcyB3b3VsZCBvbmx5IHNlcnZlIHRvIG11ZGRsZSBvdXIKPiBjb25jbHVzaW9uLgo+Cj4gT24gdGhlIGxvZ2lzdGljcyBzaWRlLCBhcyBtZW50aW9uZWQgYWJvdmUsIHRoZXJlJ3Mgb25seSBzbyBtdWNoCj4gZHJpdmluZyBhbmQgaHVudGluZyBmb3IgaW5kaXZpZHVhbCBnZW5vbWVzIHRoYXQgY2FuIGJlIGRvbmUgYmVmb3JlCj4gcmVhbCB3b3JsZCBjb25zdHJhaW50cyBsaWtlICJncmFudCBkZWFkbGluZXMiIGFuZCAic2Vhc29ucyIgYmVjb21lIGFuCj4gaXNzdWUuIEJ1dCBiZWNhdXNlIGJpZ2dlciBwbG90cyBhcmUgY2hlYXBlciB0aGFuIHJlcGVhdGluZyBwbG90cwo+IGFjcm9zcyB0aW1lLCB0aGVyZSdzIGFuIGluY2VudGl2ZSB0byBtYXhpbWl6ZSB0aGUgYW1vdW50IHlvdSBjYW4gZG8gYXQKPiBvbmUgdGltZSAoYWxzbywgdGhlcmUncyBhIGNoYW5jZSBhdCB0ZW1wb3JhbCBwc2V1ZG9yZXBsaWNhdGlvbiBpZgo+IG11bHRpcGxlIGZpZWxkIHNlYXNvbnMgYXJlIHVzZWQsIGJ1dCB0aGF0IHdvdWxkIGJlIGNvbnRpbmdlbnQgb24KPiBkZXNpZ24pLiBDbG9uYWwgcmVwbGljYXRlcyB2aWEgcGxhbnQgdGlzc3VlIGN1bHR1cmUgYXJlIHJlYXNvbmFibHkKPiBlYXN5IHRvIGNyZWF0ZSwgYW5kIGNhbiBiZSBkb25lIGluIGEgbGFiIGJlZm9yZSBiZWluZyBwbGFudGVkIGluIGEKPiBmaWVsZCBpbiBvcmRlciB0byBzdGFuZGFyZGl6ZSB0aGUgcHJvY2VzcyBhcyBtdWNoIGFzIHBvc3NpYmxlLgoKIyMjIDEuMS4zIElzIHRoaXMgYSAqbWVuc3VyYXRpdmUqIG9yICptYW5pcHVsYXRpdmUqIGV4cGVyaW1lbnQ/IERvZXMgdGhlIGRlc2lnbiBtYXRjaCB0aGUgc2NvcGUgb2YgdGhlIHJlc2VhcmNoIHF1ZXN0aW9uPyBbMTAgcG9pbnRzXQoKTm90ZTogTWVuc3VyYXRpdmUgZXhwZXJpbWVudHMgaW5jbHVkZSBib3RoICJzaW1wbGUgbWVuc3VyYXRpdmUiIGFuZAoiY29tcGFyaXRpdmUgbWVuc3VyYXRpdmUiIGV4cGVyaW1lbnRzCgo+IFRoaXMgaXMgYSBjb21wYXJpdGl2ZSBtZW5zdXJhdGl2ZSBleHBlcmltZW50OiBvbmUgdGhhdCBzZWVrcyB0bwo+IGNvbXBhcmUgbWVhc3VyZW1lbnRzIG9mIG90aGVyd2lzZSB1bm1vZGlmaWVkIGV4cGVyaW1lbnRhbCB1bml0cywgYW5kCj4gbGFja3MgYW55IG1hbmlwdWxhdGlvbiBvZiBhbnkga2luZCBvZiBjb25kaXRpb24gZm9yIGEgbWFuaXB1bGF0aXZlCj4gZXhwZXJpbWVudC4KPgo+IFRoZSBkZXNpZ24gZmFsbHMgc2hvcnQgb2YgdGhlIHNjb3BlLCBpbiBteSBvcGluaW9uLiAxMCB1bmlxdWUgZ2Vub21lcwo+IGZvciBlYWNoIHBsb2lkeSBpbnRyb2R1Y2VzIHRvbyBtYW55IHBvaW50cyBvZiBjb25mdXNpb24gZm9yIG1lIHRvCj4gY29uc2lkZXIgaXQgYXBwcm9wcmlhdGUuIEFueSBudW1iZXIgb2YgdGhpbmdzIGNvdWxkIGNvbnRyaWJ1dGUgdG8KPiBiaW9tYXNzIHByb2R1Y3Rpb24sIGFuZCB0aGVyZSdzIG5vIHdheSBpbiB0aGUgZXhwZXJpbWVudCBkZXNpZ24gdG8KPiAqZW5zdXJlKiB0aGF0IHRoZSBlZmZlY3QgaXMgc29sZWx5IGR1ZSB0byBwbG9pZHkuIFRoaXMgaXMgYSBjYXNlIHdoZXJlCj4gYSBtYW5pcHVsYXRpdmUgZXhwZXJpbWVudCB3b3VsZCBiZSBtb3JlIGFwcHJvcHJpYXRlLCBpbiBteSBvcGluaW9uLgo+IFRoYXQgd291bGQgYmUgdGhlIG9ubHkgd2F5IHRvIGlzb2xhdGUgcGxvaWR5IGFzIHRoZSBzb3VyY2Ugb2YgYW55Cj4gZWZmZWN0LCBieSBlbnN1cmluZyB0aGF0IHRoZSBkaWZmZXJlbnQgZXhwZXJpbWVudGFsIHVuaXRzIGFyZQo+IG90aGVyd2lzZSBpZGVudGljYWwuIE90aGVyd2lzZSwgZXh0ZW5zaXZlLCBleHBlbnNpdmUgZ2VuZXRpYyBzY3JlZW5zCj4gd291bGQgYmUgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IHRoZSBkaWZmZXJlbnQgZ2Vub21lcyBhcmUgc2ltaWxhcgo+IGVub3VnaCB0byBjb21wYXJlLgo+Cj4gQSBtYW5pcHVsYXRpdmUgZXhwZXJpbWVudCB3b3VsZCByZXF1aXJlIG1vcmUgc3RlcHMgYnV0IG1heSBub3QgYmUgdGhhdAo+IHVuYXR0YWluYWJsZTsgSSB3b3VsZCBzdGFydCB3aXRoIGEgY2FuZGlkYXRlIGdlbmUgc3R1ZHkgcnVubmluZyBhIEdXQVMKPiBmb3IgaGVpZ2h0IGluIGEgZ3JvdXAgb2Ygc2ltaWxhciBpbmRpdmlkdWFscyAoaS5lLiBqdXN0IGRpcGxvaWQgb3IKPiB0cmlwbG9pZCksIHRoZW4gZnJvbSB0aGVyZSBzZWUgaWYgaW5zdGVhZCBvZiBmdWxsIHBvbHlwbG9pZHksIGlmIG91cgo+IHRhcmdldCBvcmdhbmlzbSB3b3VsZCBpbnN0ZWFkIGJlIHRvbGVyYW50IHRvIGFuZXVwbG9pZHkuIENyZWF0aW9uIG9mCj4gYW5ldXBsb2lkaWMgc3RyYWlucyBpcyBtdWNoIHNpbXBsZXIgYW5kIGNoZWFwZXIgdGhhbiBpbmR1Y2luZwo+IHBvbHlwbG9pZHkgb3IgcmVkdWNpbmcgcGxvaWR5LiBBbiAqaW4gdml0cm8qIG9yIHRpc3N1ZS1jdWx0dXJlIHByb29mCj4gb2YgY29uY2VwdCB3b3VsZCBub3Qgb25seSBsZW5kIG1vcmUgc3RyZW5ndGggdG8gYW55IGNvbmNsdXNpb24geW91Cj4gbWFrZSwgYnV0IGFsc28gbWFrZSB5b3UgYSBzdHJvbmdlciBjYW5kaWRhdGUgZm9yIGZ1bmRpbmcuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIDEuMiBBbmFseXNlIGRhdGEgY29sbGVjdGVkIGZyb20gdGhlIGV4cGVyaW1lbnQKCkRhdGEgZnJvbSB0aGUgZXhwZXJpbWVudCBhcmUgaGVyZToKCmBgYHtyfQpibHVlc3RlbV9kYXRhIDwtIHJlYWQuY3N2KCdibHVlc3RlbS5jc3YnKQpzdHIoYmx1ZXN0ZW1fZGF0YSkKYGBgCgojIyMgMS4yLjEgRmlsbCBpbiB0aGUgRGVzaWduIFRhYmxlIGZvciB0aGlzIGV4cGVyaW1lbnQgWzEwIHBvaW50c10KClByb3ZpZGUgYW4gZXhwbGFuYXRpb24gZm9yIHlvdXIgY2hvaWNlIG9mICoqRXhwZXJpbWVudGFsIFVuaXQqKiBhbmQKKipSZXBsaWNhdGlvbioqIGZvciB0aGUgdHJlYXRtZW50Cgp8IFN0cnVjdHVyZSB8IFZhcmlhYmxlICAgICAgIHwgVHlwZSAgICAgICAgfCBcIyBsZXZlbHMgfCBFeHBlcmltZW50YWwgVW5pdCB8IFJlcGxpY2F0aW9uIHwKfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLXwKfCBUcmVhdG1lbnQgfCBQbG9pZHkgICAgICAgICB8IENhdGVnb3JpY2FsIHwgMiAgICAgICAgIHwgR2Vub3R5cGUgICAgICAgICAgfCBOb25lICAgICAgICB8CnwgRGVzaWduICAgIHwgR2Vub3R5cGUgICAgICAgfCBDYXRlZ29yaWNhbCB8IDIwICAgICAgICB8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfAp8ICAgICAgICAgICB8IENsb25lICAgICAgICAgIHwgQ2F0ZWdvcmljYWwgfCAzICAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwKfCAgICAgICAgICAgfCBHZW5vdHlwZTpDbG9uZSB8IENhdGVnb3JpY2FsIHwgNjAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICB8CnwgUmVzcG9uc2UgIHwgQmlvbWFzcyAgICAgICAgfCBOdW1lcmljICAgICB8IDYwICAgICAgICB8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfAoKPiBJIGNob3NlIGdlbm90eXBlIGFzIHRoZSBleHBlcmltZW50YWwgdW5pdCwgaXQgd2FzIHRoZSBiZXN0IGNob2ljZQo+IGdpdmVuIHRoYXQgZWFjaCBjb3JyZXNwb25kZWQgdG8gYSBzaW5nbGUgdHJlYXRtZW50IGxldmVsIChpLmUuIGRpcGxvaWQKPiBvciB0cmlwbG9pZCkuIEkgY29uc2lkZXJlZCB0aGUgY2xvbmVzLCBidXQgdWx0aW1hdGVseSBkZWNpZGVkIHRoYXQKPiB0aGV5IHdlcmUgbW9yZSBhcHByb3ByaWF0ZWx5IGRlc2NyaWJlZCBhcyBzdWJzYW1wbGVzLCBnaXZlbiB0aGF0IHRoZXkKPiB3ZXJlIGNvcGllcyBvZiBhIHNpbmdsZSBnZW5vdHlwZSBhbmQgdGhlcmVmb3JlCgojIyMgMS4yLjIgRG8gYW55IGNvbHVtbnMgb2YgYGJsdWVzdGVtX2RhdGFgIG5lZWQgdG8gYmUgY2hhbmdlZCBvciBhZGRlZCB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGRlc2lnbiB0YWJsZT8gWzUgcG9pbnRzXQoKTWFrZSBhbnkgbmVjZXNzYXJ5IGNoYW5nZXMgaGVyZToKCmBgYHtyfQpibHVlc3RlbV9kYXRhJENsb25lID0gYXMuZmFjdG9yKGJsdWVzdGVtX2RhdGEkQ2xvbmUpCmBgYAoKPiBTdXJlIGRvISBFdmVyeSBjb2x1bW4gb2YgdGhlIGRhdGEgc2F2ZSBgQmlvbWFzc2AgYXJlIGNhdGVnb3JpY2FsIGFuZAo+IG5lZWQgdG8gYmUgZWl0aGVyIGBjaHJgIG9yIGBmYWN0b3JgLCBhbmQgc2luY2UgYENsb25lYCBpcyBub3QsIEkgd2lsbAo+IGNvbnZlcnQgaXQgdG8gYGZhY3RvcmAuCgojIyMgMS4yLjMgV3JpdGUgdGhlIGxpbmVhciBtb2RlbCBmb3IgdGhpcyBleHBlcmltZW50IHVzaW5nIHRoZSBSIGZ1bmN0aW9uIGBsbSgpYCBvciBgbG1lcigpYCBhcyBhcHByb3ByaWF0ZTogWzUgcG9pbnRzXQoKRXhwbGFpbiB3aHkgeW91IGNob3NlIGBsbSgpYCBvciBgbG1lcigpYAoKYGBge3J9CmJpb21vZCA8LSBsbWVyKEJpb21hc3MgfiBQbG9pZHkgKyAoMXxHZW5vdHlwZSkgKyBDbG9uZSwgZGF0YSA9IGJsdWVzdGVtX2RhdGEpCmBgYAoKPiBJJ20gZ29pbmcgdG8gdXNlIGxtZXIgaGVyZSwgc2luY2UgdGhlcmUgaXMgc29tZSByYW5kb21uZXNzIHRoYXQgZWFjaAo+IHN1YnNhbXBsZSBjbG9uZSBjYW4gY29udHJpYnV0ZSB0byBlZmZlY3QgKGkuZS4sIGdpdmVuIHRocmVlIGNsb25lcwo+IHdpdGggbm8gb3RoZXIgZGlmZmVyZW5jZXMsIHRoZXJlIGNvdWxkIHN0aWxsIGJlIGRpZmZlcmVudCBlc3RpbWF0aW9ucwo+IG9mIGVmZmVjdHMgZHVlIHRvIHJhbmRvbW5lc3MpLgoKIyMjIDEuMi40IE1ha2UgdGhlIG1vZGVsIGRpYWdub3N0aWMgcGxvdHMgc2hvd24gaW4gbGFiLiBJcyB0aGVyZSByZWFzb24gdG8gYmUgY29uY2VybmVkIGFib3V0IGFueSBvZiB0aGUgbW9kZWwgYXNzdW1wdGlvbnM/IFs1IHBvaW50c10KCmBgYHtyfQpwbHMyMDVfZGlhZ25vc3RpY3MoYmlvbW9kKQpgYGAKCj4gT3VyIG5vcm1hbGl0eSBhc3N1bXB0aW9uIGxvb2tzIGdvb2QsIGFuZCB0aGUgdmFyaWFuY2VzIGFyZSByZWxhdGl2ZWx5Cj4gc2ltaWxhciB0byBlYWNoIG90aGVyLCB0aG91Z2ggdGhlcmUgYXJlIGEgZmV3IHRoYXQgYXJlIGhpZ2hlciB0aGFuIHRoZQo+IG90aGVycy4gVGhpcyBtaWdodCBiZSBhIHBsYWNlIHRvIGJlIGNvbmNlcm5lZCwgYnV0IG90aGVyd2lzZSB3ZSdyZSBpbgo+IHRoZSBjbGVhci4KCiMjIyAxLjIuNSBVc2UgdGhlIGBlbW1lYW5zKClgIGFuZCBgY29udHJhc3QoKWAgZnVuY3Rpb25zIHRvIHBlcmZvcm0gYSBIeXBvdGhlc2lzIHRlc3QgYWdhaW5zdCB0aGUgbnVsbCBoeXBvdGhlc2lzIHRoYXQgdGhlIFBsb2lkeSBoYWQgbm8gZWZmZWN0IG9uIGJpb21hc3MuIFsxMCBwb2ludHNdCgpSZXBvcnQgdGhlIHJlc3VsdCBvZiB0aGlzIHRlc3QgYXMgaWYgeW91IHdlcmUgd3JpdGluZyBhIHBhcGVyIGluIGEKam91cm5hbCB0aGF0IHJlcXVlc3RzIHlvdSB1c2UgJFxhbHBoYSA9IDAuMDUkLgoKYGBge3J9CmJpb21lYW5zIDwtIGVtbWVhbnMoYmlvbW9kLCBzcGVjID0gJ1Bsb2lkeScpCmRpZmZtZWFucyA8LSBjb250cmFzdChiaW9tZWFucywncGFpcndpc2UnKQpkaWZmc3VtbWFyeSA9IHN1bW1hcnkoZGlmZm1lYW5zLCBsZXZlbCA9IDAuOTUsIGluZmVyID0gYyhGLFQpKQpwcmludChkaWZmc3VtbWFyeSkKYGBgCgo+IE91ciBlc3RpbWF0ZSBvZiBwbG9pZHkgYXBwZWFycyB0byBiZSBzaWduaWZpY2FudCBhdCBhID0gMC4wNSwgY2F1c2luZwo+IHVzIHRvIHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzIHRoYXQgdGhlIGVzdGltYXRlIG9mIGl0cyBlZmZlY3QgaXMgMC4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIVtdKGJsdWViZXJyaWVzLmpwZyl7d2lkdGg9IjUwMCJ9CgojIFBhcnQgMgoKQW4gZXhwZXJpbWVudCB3YXMgcnVuIHRvIHRlc3Qgd2hldGhlciBkaXVybmFsIG9yIG5vY3R1cm5hbCBwb2xsaW5hdGlvbgppcyBtb3JlIGltcG9ydGFudCBmb3IgZnJ1aXQgc2V0IGluIGxvd2J1c2ggYmx1ZWJlcnJpZXMuIEEgbGFyZ2UgcGF0Y2ggb2YKbG93YnVzaCBibHVlYmVycmllcyB3YXMgc2VsZWN0ZWQgYXQgdGhlIGVuZCBvZiBNYXkgYW5kIDMwIGJyYW5jaGVzIHdpdGgKdW5vcGVuZWQgZmxvd2VycyB3ZXJlIGlkZW50aWZpZWQsIHdpdGggb25seSBhIHNpbmdsZSBicmFuY2ggc2VsZWN0ZWQgcGVyCmluZGl2aWR1YWwgYnVzaC4gRWFjaCBicmFuY2ggd2FzIHJhbmRvbWx5IGFsbG9jYXRlZCB0byBvbmUgb2YgNQp0cmVhdG1lbnRzOgoKMS4gIE5vIHBvbGxpbmF0b3JzOiBMZWZ0IGNvbnRpbnVhbGx5IGJhZ2dlZCAobm8gcG9sbGluYXRvciBhY2Nlc3MpCjIuICBEaXVybmFsIHBvbGxpbmF0b3JzOiBiYWdnZWQgdG8gZXhjbHVkZSBwb2xsaW5hdG9ycyBkdXJpbmcgbmlnaHR0aW1lCiAgICBob3VycwozLiAgTm9jdHVybmFsIHBvbGxpbmF0aW9uOiBiYWdnZWQgdG8gZXhjbHVkZSBwb2xsaW5hdG9ycyBkdXJpbmcgZHVyaW5nCiAgICBkYXl0aW1lIGhvdXJzCjQuICBObyBiYWcgdHJlYXRtZW50OiBjb250aW51b3VzIHBvbGxpbmF0b3IgYWNjZXNzCjUuICBTaGFtIHRyZWF0bWVudDogYmFncyBwbGFjZWQgYW5kIGltbWVkaWF0ZWx5IHJlbW92ZWQgb25jZSBkYWlseSB0bwogICAgc3RpbXVsYXRlIGV4cGVyaW1lbnRhbCBmbG93ZXIgbWFuaXB1bGF0aW9uIGR1cmluZyB0cmVhdG1lbnRzIDIgYW5kIDMKCkVhY2ggYnJhbmNoIHdhcyBtb25pdG9yZWQgdW50aWwgZnJ1aXRzIGhhZCBiZWVuIHNldCwgYW5kIHRoZW4gdGhleQptZWFzdXJlZCB0aGUgcGVyY2VudGFnZSBvZiBmbG93ZXIgYnVkcyB0aGF0IHNldCBmcnVpdCBwZXIgYnJhbmNoLgoKVGhlIHJlc2VhcmNoZXJzIHByZXNlbnRlZCB0aGUgZm9sbG93aW5nIHN1bW1hcml6ZWQgZGF0YToKCnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICoqTm8gcG9sbGluYXRvcnMqKiB8IERpdXJuYWwgcG9sbGluYXRvcnMgfCBOb2N0dXJuYWwgcG9sbGluYXRvcnMgfCBObyBiYWdzIHwgU2hhbSB8CnwtLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLS18CnwgTnVtIHJlcHM6ICRuX2kkICAgICAgICAgICAgICB8IDYgICAgICAgICAgICAgICAgICB8IDYgICAgICAgICAgICAgICAgICAgfCA2ICAgICAgICAgICAgICAgICAgICAgfCA2ICAgICAgIHwgNiAgICB8CnwgU2FtcGxlIG1lYW4gKCUpOiAkXGhhdFxtdV9pJCB8IDIwICAgICAgICAgICAgICAgICB8IDUyICAgICAgICAgICAgICAgICAgfCAzMyAgICAgICAgICAgICAgICAgICAgfCA1OCAgICAgIHwgNDggICB8CnwgU2FtcGxlIFNEOiAkXHNxcnR7c14yX2l9JCAgICB8IDQuMSAgICAgICAgICAgICAgICB8IDUuMyAgICAgICAgICAgICAgICAgfCAzLjcgICAgICAgICAgICAgICAgICAgfCA3ICAgICAgIHwgNi4zICB8CgojIyMgMi4xIElzIHRoaXMgYSBEaXJlY3Qgb3IgSW5kaXJlY3QgZXhwZXJpbWVudD8gWzUgcG9pbnRzXQoKRXhwbGFpbiB5b3VyIGFuc3dlcgoKPiBJbmRpcmVjdC4gVGhpcyBpbnZvbHZlcyB0aGUgbWVhc3VyZW1lbnQgb2YgYSBmZXcgZGlmZmVyZW50IG1lYW5zLCBidXQKPiBlYWNoIEVVIGlzIG9ubHkgc3ViamVjdGVkIHRvIGEgc2luZ2xlIHRyZWF0bWVudCBsZXZlbC4gSXQncyBwb3NzaWJsZQo+IHRvIGRpcmVjdGx5IGVzdGltYXRlIHRoZSBtZWFucyBvZiBlYWNoIEVVLCBhbmQgd2l0aCB0aG9zZSB3ZSB3aWxsCj4gaW5kaXJlY3RseSBlc3RpbWF0ZSB0aGUgZGlmZmVyZW5jZSwgZGVsdGEtaGF0LiAoSS5FLiBtdS1BIC0gbXUtQiBhbmQKPiBzbyBvbikKCiMjIyAyLjIgRXN0aW1hdGUgdGhlIG1heGltdW0gZWZmZWN0IG9mIHRoZSBwb2xsaW5hdG9yIGV4Y2x1c2lvbiBiYWdzIG9uIGZydWl0IHNldC4gUHJvdmlkZSBhIDk1JSBjb25maWRlbmNlIGludGVydmFsIGFyb3VuZCB0aGlzIGVzdGltYXRlLiBbMTAgcG9pbnRzXQoKQ2hvb3NlIHdoaWNoIGNvbXBhcmlzb25zIGFyZSByZWxldmFudCB0byB0aGlzIHF1ZXN0aW9uIGFuZCB1c2UgdGhvc2UgdG8KY2hvb3NlIGFuIGFwcHJvcHJpYXRlIGNyaXRpY2FsIHZhbHVlIGZyb20gdGhlIHRhYmxlIGJlbG93LiBZb3UgbWlnaHQgbm90Cm5lZWQgdG8gY29tcGFyZSBhbGwgdGhlIGZpdmUgdHJlYXRtZW50cyB0byBhbnN3ZXIgdGhlIHF1ZXN0aW9uLgoKfCBEaXN0cmlidXRpb24gfCBERiA9IDEwIHwgREYgPSAxNSB8IERGID0gMjAgfCBERiA9IDI1IHwKfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwKfCBUICAgICAgICAgICAgfCAyLjIzICAgIHwgMi4xMyAgICB8IDIuMDkgICAgfCAyLjA2ICAgIHwKfCBEdW5uZXQoMykgICAgfCAyLjc2ICAgIHwgMi42MyAgICB8IDIuNTYgICAgfCAyLjUyICAgIHwKfCBUdWtleSg0KSAgICAgfCAzLjA2ICAgIHwgMi44OCAgICB8IDIuOCAgICAgfCAyLjc1ICAgIHwKfCBUdWtleSg1KSAgICAgfCAzLjI5ICAgIHwgMy4wOSAgICB8IDIuOTkgICAgfCAyLjk0ICAgIHwKCmBgYHtyfQp0Y3JpdCA9IDIuOTQgI3VzaW5nIFR1a2V5KDUpCm5jbWVhbiA9IDU4CmRtZWFuID0gNTIKbm1lYW4gPSAzMwpzaG1lYW4gPSA0OApub21lYW4gPSAyMApkZXN0ID0gbmNtZWFuIC0gZG1lYW4KbmVzdCA9IG5jbWVhbiAtIG5tZWFuCnNoZXN0ID0gbmNtZWFuIC0gc2htZWFuCm5vZXN0ID0gbmNtZWFuIC0gbm9tZWFuCm1heGVzdCA9IG1heChkZXN0LCBuZXN0LCBzaGVzdCkgI21heCBpcyBub2N0dXJuYWwgb25seSAtIG5vIGJhZy4KbWF4ZXN0CnNlZG1heCA9IDcgLyBzcXJ0KDYpICsgMy43IC8gc3FydCg2KQpjaXVwcGVyID0gbWF4ZXN0ICsgKHRjcml0ICogc2VkbWF4KQpjaWxvd2VyID0gbWF4ZXN0IC0gKHRjcml0ICogc2VkbWF4KQpjaXVwcGVyCmNpbG93ZXIKYGBgCgo+IEknbSBvcHRpbmcgdG8gdXNlIHRoZSBUdWtleSBkaXN0cmlidXRpb24uIFRoZSBnb2FsIGlzIHRvIGZpbmQgdGhlCj4gbWF4aW11bSBlZmZlY3Qgb2YgYmFnZ2luZy4gVGhhdCBpcyBpbiBlc3NlbmNlIGEgInBhaXJ3aXNlIiBjb21wYXJpc29uLAo+IHNpbmNlIHdpdGhvdXQgY29tcGFyaW5nIHR3byBiYWdnaW5nIHNjaGVtYSBpdCBpcyBpbXBvc3NpYmxlIHRvCj4gZGV0ZXJtaW5lIHdoYXQgdGhlICdtYXhpbXVtJyBpcy4gVHdvIHNjaGVtYSBjb3VsZCBpbmRlZWQgYmUgZGlmZmVyZW50Cj4gdGhhbiB0aGUgY29udHJvbCBhcyBwZXIgdGhlIER1bm5ldHQgZGlzdHJpYnV0aW9uLCBidXQgaW4gdGhlIER1bm5ldHQKPiBkaXN0cmlidXRpb24gd2UgY2Fubm90IGRpcmVjdGx5IGNvbXBhcmUgdGhlIHRyZWF0bWVudHMuIFdpdGggdGhhdCBpbgo+IG1pbmQsIEknbSBnb2luZyB0byBjb21wYXJlIGFsbCBvZiB0aGUgdHJlYXRtZW50IGxldmVscyB0byB0aGUgIk5vIEJhZyIKPiBsZXZlbCwgd2hpY2ggaXMgdGhlIG5lZ2F0aXZlIGNvbnRyb2wuIFRoZSB2YWx1ZXMgb3RoZXIgdGhhbiBEaXVybmFsCj4gYW5kIE5vY3R1cm5hbCBhcmUgY29udHJvbHMvc2FuaXR5IGNoZWNrcywgYW5kIGltcG9ydGFudCB0byB2ZXJpZnkgdGhhdAo+IHRoZSBkZXNpZ24gZnVuY3Rpb25zIHRvIGFuc3dlciB0aGlzIHF1ZXN0aW9uLiBIb3dldmVyLCB0aGUgbmVnYXRpdmUKPiBhbmQgcG9zaXRpdmUgY29udHJvbHMgd2lsbCBub3QgYmUgY2FuZGlkYXRlcyBmb3IgIm1heGltdW0gZWZmZWN0Ii4KPgo+IE15IGRlZ3JlZXMgb2YgZnJlZWRvbSB3aWxsIGVxcHVhbCAyNSBpbiB0aGlzIGNhc2UsIDVcKig2LTEpLCBzaW5jZSBJCj4gd2lsbCBiZSBjb21wYXJpbmcgYWxsIHRyZWF0bWVudHMgdG8gZWFjaCBvdGhlciwgd2hpY2ggbWFrZXMgbXkgdC1jcml0Cj4gMi45NC4KPgo+IE15IGVzdGltYXRlZCBlZmZlY3QgaXMgLTI1JSwgd2l0aCBhIGNvbmZpZGVuY2UgaW50ZXJ2YWwgb2YgLTEyLjIlIHRvCj4gLTM3LjglCgojIyMgMi4zIFNpbmNlIHRoZSByZXNlYXJjaGVyJ3Mgc3RhdGVkIGdvYWwgd2FzIHRvIGNvbXBhcmUgZnJ1aXQgc2V0IGJldHdlZW4gdGhlIGRpdXJuYWwgYW5kIG5vY3R1cm5hbCB0cmVhdG1lbnRzLCB3b3VsZCB0aGV5IGhhdmUgYmVlbiBiZXR0ZXIgb2ZmIGFsbG9jYXRpbmcgOSBicmFuY2hlcyB0byB0aG9zZSB0d28gdHJlYXRtZW50cyBhbmQgb25seSA0IHRvIHRoZSBvdGhlcnM/IFsxMCBwb2ludHNdCgpXaGF0IGNvbXBhcmlzb25zIHdvdWxkIGhhdmUgaGFkIHNtYWxsZXIgVFJVRSBzdGFuZGFyZCBlcnJvcnM/IFdoaWNoCmNvbXBhcmlzb25zIHdvdWxkIGhhdmUgaGFkIGxhcmdlciBUUlVFIHN0YW5kYXJkIGVycm9ycz8gSG93IG11Y2gKc21hbGxlci9sYXJnZXI/CgpgYGB7cn0KMS9zcXJ0KDQpIC0gMS9zcXJ0KDYpCjEvc3FydCg5KSAtIDEvc3FydCg2KQpgYGAKCj4gQXNzdW1pbmcgdGhhdCB0aGUgdmFyaWFuY2VzIG9mIHBvcHVsYXRpb24gYW5kIG1lYXN1cmVtZW50IGRpZG4ndAo+IGNoYW5nZSAod2hpY2ggdGhleSBzaG91bGRuJ3QgZm9yIHRydWUgdmFsdWVzLCB0aGUgc3RhbmRhcmQgZXJyb3JzIG9mCj4gYWxsIHRyZWF0bWVudHMgd2l0aCBuID0gNCB3b3VsZCBiZSBsYXJnZXIsIGFuZCBhbGwgdHJlYXRtZW50cyB3aXRoIG4gPQo+IDkgd291bGQgYmUgc21hbGxlci4gVGhlIHNxdWFyZSByb290IG9mIDYgaXMgMi40NSwgc28gdGhlIG4gPSA0Cj4gc3RhbmRhcmQgZXJyb3JzIHdvdWxkIGluY3JlYXNlIGJ5IDkuMSUsIGFuZCB0aGUgbiA9IDkgc3RhbmRhcmQgZXJyb3JzCj4gd291bGQgZGVjcmVhc2UgYnkgNy41JQoKIyMjIDIuNCBTcGVjdWxhdGUgb24gV0hZIHRoZSByZXNlYXJjaGVycyBpbmNsdWRlZCB0cmVhdG1lbnRzIFwjJ3MgMSwgNCwgYW5kIDUgaW4gdGhpcyBleHBlcmltZW50LiBbMTAgcG9pbnRzXQoKLSAgIEV4cGxhaW4gd2hhdCB0aGV5IHdvdWxkIGNvbmNsdWRlIGlmIHRoZXkgb2JzZXJ2ZWQgZnJ1aXQgc2V0IHdhc24ndAogICAgbXVjaCBsb3dlciBpbiAjMSB0aGFuICM0LiBXb3VsZCB0aGlzIGNoYW5nZSB0aGUgaW50ZXJwcmV0YXRpb24gb2YKICAgIHRoZSBlZmZlY3QgZGl1cm5hbCB2cyBub2N0dXJuYWwgcG9sbGluYXRvciBleGNsdXNpb24/CgotICAgRXhwbGFpbiB3aGF0IHRoZXkgd291bGQgY29uY2x1ZGUgaWYgdGhleSBvYnNlcnZlZCB0aGF0IGZydWl0IHNldCB3YXMKICAgIG11Y2ggbG93ZXIgaW4gIzUgdGhhbiAjNC4gV291bGQgdGhpcyBjaGFuZ2UgdGhlIGludGVycHJldGF0aW9uIG9mCiAgICB0aGUgZWZmZWN0IGRpdXJuYWwgdnMgbm9jdHVybmFsIHBvbGxpbmF0b3IgZXhjbHVzaW9uPwoKPiBUcmVhdG1lbnRzIDEsIDQsIGFuZCA1IGFyZSBwcmVzZW50IGFzIGNvbnRyb2xzLiBUaGV5IGFyZSB0aGVyZSB0bwo+IGVuc3VyZSB0aGF0IGFueSBjaGFuZ2VzIHRoYXQgY2FuIGJlIG9ic2VydmVkIGFyZSB0aGUgcmVzdWx0IG9mIHRoZWlyCj4gZXhwZXJpbWVudCBhbmQgbm90IG91dHNpZGUgZmFjdG9ycy4gSWYgdGhlIGZydWl0IHNldCB3YXNuJ3QgbXVjaCBsb3dlcgo+IGluICMxIHRoYW4gIzQsIGl0IHdvdWxkIGNhc3QgaW50byBxdWVzdGlvbiB0aGUgZWZmaWNhY3kgb2YgdGhlIGJhZ3MgaW4KPiBwcmV2ZW50aW5nIHBvbGxpbmF0aW9uLiBBbnkgZGlmZmVyZW5jZSBpbiBkaXVybmFsIHZzIG5vY3R1cm5hbAo+IGV4Y2x1c2lvbiB3b3VsZCBiZSBkaWZmaWN1bHQgdG8gYXR0cmlidXRlIHRvIGlzb2xhdGlvbiB2aWEgYSBiYWcgdGhhdAo+IGlzIG90aGVyd2lzZSBmYXVsdHkuCj4KPiBJZiB0aGUgZnJ1aXQgc2V0IGluIDUgd2FzIG11Y2ggbG93ZXIgdGhhbiA0LCB0aGVuIHRoZSBtZXJlIGFjdCBvZgo+IHBsYWNpbmcgYSBiYWcgb24gYSBicmFuY2ggY291bGQgYmUgcmVkdWNpbmcgdGhlIGZydWl0IHNldC4gVGhpcywgdG9vLAo+IHdvdWxkIGVmZmVjdCB0aGUgaW50ZXJwcmV0YXRpb24gb2YgZGl1cm5hbCB2cyBub2N0dXJuYWwgcG9sbGluYXRvcgo+IGV4Y2x1c2lvbiwgYmVjYXVzZSBpdCB3b3VsZCBjYXN0IGludG8gZG91YnQgdGhhdCB0aGUgcmVkdWN0aW9uIHdhcyBkdWUKPiB0byBleGNsdXNpb24gYW5kIG5vdCB0aGUgcGh5c2ljYWwgbWFuaXB1bGF0aW9uIG9uIHRoZSBicmFuY2ggYnkgdGhlCj4gYmFnIGl0c2VsZi4K